# 基本功能：
#通过鼠标进行基本图形的绘制
# 1.画线：当用户按下"l"键,即可画直线，此时，滑动鼠标即可画线
# 2.画矩形：当用户按下"r"键，即可绘制矩形，此时，滑动鼠标即可画矩形
# 3.可以画圆：当用户按下"c"键，即可绘制圆形，此时滑动鼠标即可画圆
import cv2 as cv
import numpy as np
#显示窗口和背景(高度、宽度，通道数)
img=np.zeros((480,640,3),np.uint8)
#定义当前图形,0:线；1：矩形，2：圆
currentshape=0
startpos=(0,0) #定义起始点
#鼠标回调函数(事件，x坐标,y坐标,组合键flag,userdata数据)
def mouse_callback(event,x,y,flags,userdata):
    global currentshape,startpos #生命他们是全局变量
    if event & cv.EVENT_LBUTTONDOWN==cv.EVENT_LBUTTONDOWN:
        startpos=(x,y)
    if event & cv.EVENT_LBUTTONUP == cv.EVENT_LBUTTONUP:
        if currentshape==0:
            cv.line(img,startpos,(x,y),(0,0,255))
        if currentshape==1:
            cv.rectangle(img,startpos,(x,y),(0,0,255))
        if currentshape==2:
            #画圆时，起止点的坐标计算半径
            a=(x-startpos[0])
            b=(y-startpos[1])
            r=int((a**2+b**2)**0.5)#勾股定理求半径
            cv.circle(img,startpos,r,(0,0,255))
        else:
            print("no shape...")
#创建窗口
cv.namedWindow("dropshape",cv.WINDOW_NORMAL)
#设置鼠标回调(对哪个窗口进行操作,鼠标回调函数,第三个参数userdata:如果有数据则传递到回调函数中)
cv.setMouseCallback("dropshape",mouse_callback)

while True:
    cv.imshow("dropshape",img)
    key=cv.waitKey(1)&0xFF
    if key==ord("q"):
        break
    elif key==ord("l"):
        currentshape=0
    elif key==ord("r"):
        currentshape=1
    elif key==ord("c"):
        currentshape=2
cv.destroyAllWindows()